/*
* JAVIER ANTON DIAZ DNI:48629698Q
* STANISLAV LITVINENKO DNI:02062226T
*/


#include <iostream>
#include "Circulo.h"
#include "Rectangulo.h"
#include "GrupoFiguras.h"
#include "UtilidadesSVG.h"
#include "Figura2D.h"
#include "DibujoSVG.h"
using namespace std;

IDibujable* 
UtilidadesSVG::crearFigura(string descripcion, istream& is)
{

	IDibujable* f;

	//try {
		if (descripcion=="Circulo")
		{
			f = new Circulo();
			f->leeEntrada(is);

			/*try
			{
				f = new Circulo();
				f->leeEntrada(is);
			}
			catch(ExcepcionValorNoValido& e)
			{
				throw ExcepcionValorNoValido(e);
			}*/

		}
		else if(descripcion=="Rectangulo")
		{
			f = new Rectangulo();
			f->leeEntrada(is);

		/*	try
			{
				f = new Rectangulo();
				f->leeEntrada(is);
			}
			catch(ExcepcionValorNoValido& e)
			{
				throw ExcepcionValorNoValido(e);
			}*/
		}
		else
		{
			throw ExcepcionFiguraDesconocida(descripcion);
		}
	/*}
	catch( ExcepcionFiguraDesconocida &f)
	{
		cerr << f.what() << endl;
	}*/

	return f;
}

void 
UtilidadesSVG::hacerOperacion(vector<IDibujable*>& figuras, istream& is){
	
	string sub, aux = "";
	int i=0,cantfiguras=0,idfigura=0,cx=0,cy=0,pos=0;
	float porcentaje;
	Figura2D *fig;
	GrupoFiguras* grupofig;
	IDibujable* grupito;	

	try
	{
		is >> sub; // operacion a realizar

		if(sub == "agrupar")
		{
			i=0;
			vector<Figura2D*> aux;

			is >> cantfiguras;
			while(i < cantfiguras)
			{
				is >> pos;
				aux.push_back(dynamic_cast<Figura2D*>(figuras[pos-1]));
				fig = dynamic_cast<Figura2D*>(figuras[pos-1]);
				fig->setAgrupada(true);
				i++;
			}
			getline(is,sub);
			GrupoFiguras* grupo = new GrupoFiguras(aux,sub);
			grupito = grupo;
			figuras.push_back(grupito);
			grupo = NULL;

		}
		else if(sub == "mover")
		{
			is>>idfigura;
			is>>cx;
			is>>cy;

			//Pruebas de salida

			try
			{
				Coordenada coor(cx,cy);
				if( coor.getX() > DibujoSVG::MAX_VALOR || coor.getX() < DibujoSVG::MIN_VALOR || coor.getY() > DibujoSVG::MAX_VALOR || coor.getY() < DibujoSVG::MIN_VALOR)
				{
					throw ExcepcionCoordenadaErronea(coor.getX(),coor.getY());
				}
				else
				{
					try
					{
						if( idfigura <= (int)figuras.size() && idfigura > 0 )
						{
							figuras[idfigura-1]->mover(coor);
						}
						else
						{
							throw ExcepcionValorNoValido(idfigura, "Figura inesxistente");
						}
					}
					catch( ExcepcionValorNoValido &v)
					{
						cerr << v.what()<< endl;
					}
				}
			}
			catch( ExcepcionCoordenadaErronea &c)
			{
				cerr << c.what() << endl;
			}


		}
		else if(sub == "eliminar")
		{
			is >> idfigura;
			//delete figuras[idfigura-1];

			if( (grupofig = dynamic_cast<GrupoFiguras*>(figuras[idfigura-1])) )
			{
				delete grupofig;
				figuras[idfigura-1] = NULL;
				//Reordenar

				int dim = figuras.size();
				if( idfigura == dim )
				{
					figuras.pop_back();
				}
				else
				{
					int i = idfigura-1;
					dim = figuras.size()-1;
					for( ; i < dim; i++ )
					{
						figuras[i] = figuras[i+1];
					}
						figuras[figuras.size()-1] = NULL;
						figuras.pop_back();

				}
				// Fin de redimensionar
			}
			else
			{
				if( (fig = dynamic_cast<Figura2D*>(figuras[idfigura-1])) )
				{
					if (!fig->esAgrupada())
					{
						delete figuras[idfigura-1];
						figuras[idfigura-1] = NULL;

						int dim = figuras.size();
						if( idfigura == dim )
						{
							figuras.pop_back();
						}
						else
						{
							int i = idfigura-1;
							dim = figuras.size()-1;
							for( ; i < dim; i++ )
							{
								figuras[i] = figuras[i+1];
							}
								figuras[figuras.size()-1] = NULL;
								figuras.pop_back();
						}
						// Fin de redimensionar
					}

				}
			}
			grupofig = NULL;
			fig = NULL;
		}
		else if(sub == "escalar")
		{
			is >> idfigura;
			is >> porcentaje;

			figuras[idfigura-1]->escalar(porcentaje);
		}
		else if(sub == "duplicar")
		{
			is >> idfigura;
			is >> cx;
			is >> cy;

			Coordenada coor(cx,cy);

			if ( (grupofig = dynamic_cast<GrupoFiguras*>(figuras[idfigura-1])) )
			{
				int i = 1;
				grupito = NULL;
				try
				{
					grupito = figuras[idfigura-1]->duplicar(coor);

					grupofig = dynamic_cast<GrupoFiguras*>(grupito);
					for(;i-1 < grupofig->getNumFiguras();i++)
					{

						IDibujable* brr=&((Figura2D&)grupofig->getFigura(i));
						figuras.push_back(brr);
					}

					figuras.push_back(grupito);
				}
				catch (ExcepcionCoordenadaErronea &c)
				{
					cerr << c.what();
				}

			}
			else
			{
				grupito = NULL;
				grupito = figuras[idfigura-1]->duplicar(coor);
				figuras.push_back(grupito);
			}
		}
		else
		{
			getline(is,aux);
			throw ExcepcionOperacionDesconocida(sub);
		}
	}
	catch(ExcepcionOperacionDesconocida &s)
	{
		cerr << s.what() << endl;
	}
}
